---
title: 设计模式
description: 23 种设计模式
---
:::tip
设计模式考点：分类、应用场景、设计模式的图形
:::
## 系统分层
* 架构模式：软件设计中的高层决策，例如 C/S 结构就属于架构模式，架构模式反映了软件系统过程中所做的基本设计决策。

* 设计模式：<font color='RedOrange'>每一个设计模式描述了一个在我们周围不断重复发生的问题，以及该问题的解决方案的核心</font>。这样，就能一次又一次地使用该方案而不必做重复劳动。设计模式的核心在于提供了相关问题的解决方案，使得人们可以更加简单方便的复用成功的设计和体系结构。四个基本要素：<font color='RedOrange'>模式名称、问题（应该在何时使用模式）、解决方案（设计的内容）、效果（模式应用的效果）</font>


    <img src="https://wkq-img.oss-cn-chengdu.aliyuncs.com/%7BD4731C8A-FC97-4353-A155-A503BA42B576%7D.png"/>

* 惯用法：是最底层的模式，关注软件系统的设计与实现，实现时通过某种特定的程序设计语言来描述 构件与构件之间的关系。每种编程语言都有它自己特定的模式，即语言的惯用法。例如引用-技术就是 C++语言中的一种惯用法。

## 设计模式
<table>
    <caption>创建型设计模式用来创建对象</caption>
    <thead>
    <tr>
        <th width={"20%"}>创建型设计模式</th>
        <th width={"50%"}>定义</th>
        <th>记忆关键字</th>
    </tr>
    </thead>
    <tbody>
    <tr>
        <td>Abstract Factory <br/>抽象工厂模式</td>
        <td>提供一个接口，可以创建一系列相关或相互依赖的对象，而无需指定它们具体的类</td>
        <td>抽象接口</td>
    </tr>
    <tr>
        <td>Factory Method <br/> 工厂方法模式</td>
        <td>定义一个创建对象的接口，但由子类决定需要实例化哪一个类。使得子类实例化过程推迟</td>
        <td>子类决定实例化</td>
    </tr>
    <tr>
        <td>Builder <br/> 建造器模式</td>
        <td>将一个复杂类的表示与其构造相分离，使得相同的建造过程能够得出不同的表示</td>
        <td>类和构造分离</td>
    </tr>
    <tr>
        <td>Prototype <br/> 原型模式</td>
        <td>用原型实例指定创建对象的类型，并且通过拷贝这个原型来创建新的对象</td>
        <td>原型实例，拷贝</td>
    </tr>
    <tr>
        <td>Singleton <br/> 单例模式</td>
        <td>保证一个类只有一个实例，并提供一个访问它的全局访问点</td>
        <td>唯一实例</td>
    </tr>
    </tbody>
</table>


<table>
    <caption>结构型设计模式用来描述类和对象之间是如何组织的</caption>
    <thead>
    <tr>
        <th width={"20%"}>结构型设计模式</th>
        <th width={"50%"}>定义</th>
        <th>记忆关键字</th>
    </tr>
    </thead>
    <tbody>
    <tr>
        <td>Adapter <br/>适配器模式</td>
        <td>将一个类的接口转换成用户希望得到的另一种接口</td>
        <td>转换，兼容接口</td>
    </tr>
    <tr>
        <td>Bridge <br/> 桥接模式</td>
        <td>将类的抽象部分和它的实现部分分离开来，使它们可以独立的变化</td>
        <td>抽象和实现分离</td>
    </tr>
    <tr>
        <td>Composite <br/> 组合模式</td>
        <td>将对象组合成树型结构以表示 “整体-部分”的层次结构，使得用户对单个对象和组合对象的使用具有一致性。</td>
        <td>整体-部分，树形结构</td>
    </tr>
    <tr>
        <td>Decorator <br/> 原型模式</td>
        <td>动态的给一个对象添加一些额外的职责。它提供了用子类扩展功能的一个灵活的替代，比派生一个子类更加灵活</td>
        <td>附加职责</td>
    </tr>
    <tr>
        <td>Facade <br/> 外观模式</td>
        <td>定义一个高层接口，为子系统中的一组接口提供一直的外观，从而简化了该子系统的使用</td>
        <td>对外统一接口，比如智能家具的应用场景</td>
    </tr>
    <tr>
        <td>Flyweight <br/> 享元模式</td>
        <td>提供支持大量细粒度对象共享的有效方法</td>
        <td>细粒度，共享（一般用于汉字、语音识别）</td>
    </tr>
    <tr>
        <td>Proxy <br/> 代理模式</td>
        <td>为其他对象提供一种代理以控制这个对象的访问</td>
        <td>代理控制，比如快捷方式</td>
    </tr>
    </tbody>
</table>



<table>
    <caption>行为型设计模式描述类和对象的交互行为</caption>
    <thead>
    <tr>
        <th width={"20%"}>行为型设计模式</th>
        <th width={"50%"}>定义</th>
        <th>记忆关键字</th>
    </tr>
    </thead>
    <tbody>
    <tr>
        <td>Chain of Responsibility <br/>职责链模式</td>
        <td>通过给多个对象处理请求的的机会，减少请求的发送者与接收者之间的耦合。将接收对象链接起来</td>
        <td>传递请求、职责、链接（比如请假流程）</td>
    </tr>
    <tr>
        <td>Command <br/> 命令模式</td>
        <td>将一个请求封装为一个对象，从而可用不同的请求对客户进行参数化，将请求排队或记录请求日志，支持可撤销的操作</td>
        <td>日志记录，可撤销</td>
    </tr>
    <tr>
        <td>Interpreter <br/> 解释器模式</td>
        <td>给定一种语言，定义它的文法表示，并定义一个解释器，该解释器用来根据文法表示来解释语言中的句子</td>
        <td>解释器、虚拟机</td>
    </tr>
    <tr>
        <td>Iterator <br/> 迭代器模式</td>
        <td>提供了一种方法来顺序访问一个聚合对象中的各个元素而不需要暴露该对象的内部表示</td>
        <td>顺序访问，不暴露内部</td>
    </tr>
    <tr>
        <td>Mediator <br/> 中介者模式</td>
        <td>用一个中介对象来封装一系列的对象交互。它使个对象不需要显式地互相调用，从而达成低耦合，还可以独立的改变对象间的交互</td>
        <td>不直接引用</td>
    </tr>
    <tr>
        <td>Memento <br/> 备忘录模式</td>
        <td>在不破坏封装性的前提下，捕获一个对象的内部状态，并在该对象之外保存这个状态，从而可以在以后将该对象恢复到原先保存的状态。</td>
        <td>保存、恢复</td>
    </tr>
    <tr>
        <td> <font color='RedOrange'>  Observer <br/> 观察者模式</font></td>
        <td>定义对象间的一种一对多的依赖关系，当一个对象的状态发生改变时，所有依赖于它的对象都得到通知并自动更新</td>
        <td>通知、自动更新</td>
    </tr>
    <tr>
        <td> <font color='RedOrange'>  State <br/> 状态模式  </font></td>
        <td>允许一个对象在其内部状态改变时改变它的行为</td>
        <td>状态变成类</td>
    </tr>
    <tr>
        <td> <font color='RedOrange'>  Strategy <br/> 策略模式  </font></td>
        <td>定义一系列算法，把它们一个个封装起来，并且使它们之间可以互相替换，从而让算法可以独立于使用它的用户而变化。</td>
        <td>算法替换</td>
    </tr>
    <tr>
        <td> <font color='RedOrange'>  Template Method <br/> 模板方法模式  </font></td>
        <td>定义一个操作中的算法骨架，而将一些步骤延迟到子类中，使得子类可以不改变一个算法的结构即可重新定义算法的某些特定步骤。</td>
        <td></td>
    </tr>
    <tr>
        <td> <font color='RedOrange'>  Visitor <br/> 访问者模式  </font></td>
        <td>表示一个作用与某对象结构中的各元素的操作，使得在不改变各元素的类的前提下定义作用于这些元素的新操作</td>
        <td>数据和操作分离</td>
    </tr>
    </tbody>
</table>
